package org.example.day05;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO+
 * <div>  将一个c<span>sv格式的数据</span>文件中包含有单元格引用的内容替换为对应单元格内容的实际值。 </div> <div>  <span>comma separated values(CSV) 逗号分隔值，c</span><span>sv</span><span>格式的数据文件使用逗号“,”作为分隔符将各单元的内容进行分隔。</span>  </div>
 *
 * 将一个csv格式的数据文件中包含有单元格引用的内容替换为对应单元格内容的实际值。
 * comma separated values(CSV) 逗号分隔值，csv格式的数据文件使用逗号“,”作为分隔符将各单元的内容进行分隔。
 * @date 2024/3/11 15:22
 */
public class test087 {
    public static String replaceReferences(String csvLine) {
        // 拆分输入的CSV行
        String[] cells = csvLine.split(",");

        // 确保没有超过26个单元格
        if (cells.length > 26) {
            return "-1";
        }

        // 创建一个Map来存储单元格内容
        Map<String, String> cellContents = new HashMap<>();

        // 填充Map
        for (int i = 0; i < cells.length; i++) {
            cellContents.put(String.valueOf((char) (65 + i)), cells[i]);
        }

        // 正则表达式，匹配引用例如<A>
        Pattern referencePattern = Pattern.compile("<([A-Z])>");

        try {
            // 替换引用直到没有引用
            boolean referencesRemaining = true;
            while (referencesRemaining) {
                referencesRemaining = false;
                for (String cell : cellContents.keySet()) {
                    // 查找引用
                    Matcher matcher = referencePattern.matcher(cellContents.get(cell));
                    if (matcher.find()) {
                        // 获取被引用的单元格
                        String referencedCell = matcher.group(1);
                        // 如果单元格内容自身就是一个无效的引用，返回 "-1"
                        if (cellContents.get(referencedCell).startsWith("<") && cellContents.get(referencedCell).endsWith(">")) {
                            return "-1";
                        }
                        // 替换引用为实际值
                        cellContents.put(cell, cellContents.get(cell).replace(matcher.group(0), cellContents.get(referencedCell)));
                        // 标记还有引用未处理
                        referencesRemaining = true;

                        // 确保替换后内容不超过100字符
                        if (cellContents.get(cell).length() > 100) {
                            return "-1";
                        }
                    }
                }
            }

        } catch (NullPointerException e) {
            // 如果引用了不存在的单元格，返回错误
            return "-1";
        }

        // 检查是否有未解析的无效引用
        for (String cell : cellContents.values()) {
            if (cell.contains("<") || cell.contains(">")) {
                return "-1";
            }
        }

        // 输出替换后的单元格内容
        return String.join(",", cellContents.values());
    }

    public static void main(String[] args) {
        System.out.println(replaceReferences("<B<12,1"));
    }
}
